import os
import re
from typing import Tuple, Optional


class Validators:
    """输入验证器"""
    
    @staticmethod
    def validate_access_token(token: str) -> Tuple[bool, str]:
        """验证访问令牌格式"""
        if not token or not token.strip():
            return False, "访问令牌不能为空"
        
        if len(token.strip()) < 32:
            return False, "访问令牌格式不正确，长度太短"
        
        return True, "访问令牌格式正确"
    
    @staticmethod
    def validate_repo_name(name: str) -> Tuple[bool, str]:
        """验证仓库名称"""
        if not name or not name.strip():
            return False, "仓库名称不能为空"
        
        name = name.strip()
        
        # 检查长度
        if len(name) < 1 or len(name) > 100:
            return False, "仓库名称长度应在1-100个字符之间"
        
        # 检查字符规则：只允许字母、数字、下划线、中划线（不包括点号，因为gitee不允许）
        if not re.match(r'^[a-zA-Z0-9_-]+$', name):
            return False, "仓库名称只能包含字母、数字、下划线、中划线"
        
        # 必须以字母或数字开头
        if not (name[0].isalpha() or name[0].isdigit()):
            return False, "仓库名称必须以字母或数字开头"
        
        # 不能以下划线或中划线结尾
        if name.endswith('_') or name.endswith('-'):
            return False, "仓库名称不能以下划线或中划线结尾"
        
        return True, "仓库名称格式正确"
    
    @staticmethod
    def validate_project_path(path: str) -> Tuple[bool, str]:
        """验证项目路径"""
        if not path or not path.strip():
            return False, "项目路径不能为空"
        
        path = path.strip()
        
        if not os.path.exists(path):
            return False, f"项目路径不存在: {path}"
        
        if not os.path.isdir(path):
            return False, f"项目路径不是有效的目录: {path}"
        
        # 检查是否有文件
        try:
            files = os.listdir(path)
            if not files:
                return False, f"项目目录为空: {path}"
        except PermissionError:
            return False, f"无法访问项目目录: {path}"
        
        return True, "项目路径有效"
    
    @staticmethod
    def validate_url(url: str) -> Tuple[bool, str]:
        """验证URL格式"""
        if not url or not url.strip():
            return False, "URL不能为空"
        
        url_pattern = re.compile(
            r'^https?://'  # http:// or https://
            r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|'  # domain...
            r'localhost|'  # localhost...
            r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'  # ...or ip
            r'(?::\d+)?'  # optional port
            r'(?:/?|[/?]\S+)$', re.IGNORECASE)
        
        if not url_pattern.match(url.strip()):
            return False, "URL格式不正确"
        
        return True, "URL格式正确"
    
    @staticmethod
    def validate_email(email: str) -> Tuple[bool, str]:
        """验证邮箱格式"""
        if not email or not email.strip():
            return False, "邮箱不能为空"
        
        email_pattern = re.compile(
            r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
        )
        
        if not email_pattern.match(email.strip()):
            return False, "邮箱格式不正确"
        
        return True, "邮箱格式正确"
